////////////////////////////////////////////////////////////
// Headers
////////////////////////////////////////////////////////////
#include "QuadTreeOccupant.hpp"
#include "QuadTree.hpp"
#include "QuadTreeNode.hpp"

#include <SmegTools/Debug/DebugNew.hpp>

namespace smeg {
    namespace light {


////////////////////////////////////////////////////////////
/// Default constructor
////////////////////////////////////////////////////////////
QuadTreeOccupant::QuadTreeOccupant( const sf::Vector2f& _Center, 
                                    float _fAngleDeg,
                                    bool _bIsStatic ) :
    core::BaseObject( _Center, _fAngleDeg, _bIsStatic ),
    m_pTree( 0 ),
    m_pNode( 0 ),
    m_AABB()
{
}
    
////////////////////////////////////////////////////////////
/// Copy constructor
////////////////////////////////////////////////////////////
QuadTreeOccupant::QuadTreeOccupant( const QuadTreeOccupant& _Copy ) :
    core::BaseEntity( _Copy ),
    m_pTree( _Copy.m_pTree ),
    m_pNode( _Copy.m_pNode ),
    m_AABB( _Copy.m_AABB )
{
}
    
////////////////////////////////////////////////////////////
/// Destructor
////////////////////////////////////////////////////////////
QuadTreeOccupant::~QuadTreeOccupant()
{
    RemoveFromTree();
}

////////////////////////////////////////////////////////////
/// If we are in a tree, call its update
////////////////////////////////////////////////////////////
void QuadTreeOccupant::TreeUpdate() {
    if ( !m_pTree )
        return;

    m_pTree->Update( this );
}

////////////////////////////////////////////////////////////
/// Remove this occupant from the tree
////////////////////////////////////////////////////////////
void QuadTreeOccupant::RemoveFromTree() {
    if ( !m_pTree )
        return;

    m_pTree->Remove( this );
    m_pTree = NULL;
}

/*********************** Accessors ************************/
void QuadTreeOccupant::SetCenter( float _fX, float _fY ) {
    core::BaseEntity::SetCenter( _fX, _fY );

    m_AABB.SetCenter( m_Center );
    TreeUpdate();
}

void QuadTreeOccupant::Move( float _fX, float _fY ) {
    core::BaseEntity::Move( _fX, _fY );

    m_AABB.SetCenter( m_Center );
    TreeUpdate();
}

#ifdef _DEBUG
void QuadTreeOccupant::DebugRender( const sf::Color& _Color ) const {
    m_AABB.DebugRender( _Color );
}
#endif // _DEBUG

    } // namespace light
} // namespace smeg